Often, software applications are designed to use other, previously existing software components. This dependency of software applications on other software components or artifacts (e.g., libraries) may result in numerous dependency problems, such as long chains of dependencies, conflicting dependencies, and circular dependencies.
In some instances, a software application may have a dependency on a particular version of a first artifact (e.g., a library). The software application may also have a dependency on a second artifact which, in turn, has a dependency on a different version of the first artifact. Traditionally, such a version conflict between dependencies is resolved at the artifact level.